package cn.itsource.pethome.user.service.impl;

import cn.itsource.pethome.basic.service.impl.BaseServiceImpl;
import cn.itsource.pethome.basic.util.RedisUtils;
import cn.itsource.pethome.basic.util.SendMsgUtil;
import cn.itsource.pethome.basic.util.StrUtils;
import cn.itsource.pethome.user.domain.User;
import cn.itsource.pethome.user.mapper.UserMapper;
import cn.itsource.pethome.user.service.IUserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.UUID;

@Service
public class UserServiceImpl extends BaseServiceImpl<User> implements IUserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public void checkPhone(String phone) {
        //通过手机号码查询用户对象
        User user = userMapper.loadByPhone(phone);
        //如果手机号码不为空，则抛出异常
        if (user != null) {
            throw new RuntimeException("手机号码已被注册!!");
        }
    }

    /**
         发送手机验证码的逻辑：
         1.验证码随机的(4)====》有效期是10分钟
         2.一分钟以内如果是同一个手机号码发送了多次，我就要提示用户，不能连续发送
         3.如果验证码超过了一分钟，我又点击了一次发送请求，这时候我使用的验证码应该是之前的验证码
         4.如果验证码失效了，应该产生新的验证码
     * @param phone
     */
    @Override
    public void sendMobileCodeByPhone(String phone) {
        //产生随机4位字符作为验证码而存在
        String code = StrUtils.getComplexRandomString(4);
        //通过key获取redis中对应的值   格式： oi8r:132654634534534
        String value = RedisUtils.INSTANCE.get("USER_REG:" + phone);
        //如果value不为空，就代表验证码没有过期
        if(StringUtils.isNotBlank(value)){
            //截取字符串，并且最终转为Long类型       值: 132654634534534
            Long beginTime = Long.valueOf(value.split(":")[1]);
            //如果第二次时间减去上一次的时间是小于1分钟，就证明一分钟以内发送了多次请求
            if(System.currentTimeMillis()-beginTime<60*1000){
                throw new RuntimeException("1分钟以内请别发送多次请求!!");
            }
            //如果验证码超过了一分钟，我又点击了一次发送请求，这时候我使用的验证码应该是之前的验证码
            code = value.split(":")[0];
        }
        //设置有效期是10分钟
        RedisUtils.INSTANCE.set("USER_REG:"+phone, code+":"+System.currentTimeMillis(), 10 * 60);
        //用打印语句表示发送短信
        String text = "尊敬的客户,您的验证码是:" + code + ",请在10分钟以内完成注册操作!!";
        //开始发送短信
        SendMsgUtil.sendCode(phone, text);
        //13036587579
    }

    public static void main(String[] args) {
        String str = "dfsd";
        //StringUtils.isNotBlank(str) 判断字符串是否为空，如果为空(null,"")都为false，不为空都为true
        System.out.println(StringUtils.isNotBlank(str));
    }
}
